/**
 * Copyright (c) Huawei Technologies Co., Ltd. 1987-2021. All rights reserved.
 */

package com.gitee.fufu669.utils;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 加注释
 */
public class CacheCountJavaLineUtil {

    // 赋值
    private static int validJavaLineCount = 0;
    // 赋值
    private static int blankLineCount = 0;
    // 赋值
    private static int noteLineCount = 0;
    // 赋值
    private static int JavaCheckFileCount = 0;
    // 赋值
    private static int functionLineCount = 0;
    // 赋值
    private static String fileSuffix = "java";

    // 赋值
    private static final String[] FILE_NAMES = {
        "D:\\javaprojectonhuaweicodehubv2\\experiment_v2\\Ecotest33",
    };

    // 注解
    @Test
    /**
     *  自动增加注释
     */
    public void autoCountJavaLine() {
        // 打印
        System.out.println("文件名\t代码行数\t方法数");
        // 递归程序加注释
        countJavaLine(FILE_NAMES);
        // 打印
        System.out.println("\n\n文件总个数\t" + (JavaCheckFileCount ));
        // 打印
        System.out.println("有效代码行数\t" + validJavaLineCount);
        // 打印
        System.out.println("空行数\t" + blankLineCount);
        // 打印
        System.out.println("注释行数\t" + noteLineCount);
        // 打印
        System.out.println("合计行数\t" + (validJavaLineCount + blankLineCount + noteLineCount));
        // 打印
        System.out.println("方法数\t" + functionLineCount);
    }

    /**
     * 递归程序加注释
     */
    public static void countJavaLine(String[] fileNames) {
        // 遍历
        for (String fileName : fileNames) {
            // 递归程序加注释
            countJavaLine(fileName);
        }
    }

    // 递归程序加注释
    private static void countJavaLine(String fileName) {
        // 递归程序加注释
        countJavaLine(new File(fileName));
    }

    // 递归程序加注释
    private static void countJavaLine(File file) {
        // 如果非空
        if (file != null) {
            // 如果是目录
            if (file.isDirectory()) {
                // 拿列表
                File[] filesInside = file.listFiles();
                // 遍历
                for (File fileInside : filesInside) {
                    // 递归程序加注释
                    countJavaLine(fileInside);
                }
                // 否则
            } else {
                // 判断
                if (file.getName().endsWith("." + fileSuffix)) {
                    // 赋值
                    int javaLineCountInThisJavaFile = 0;
                    // 赋值
                    int functionLineCountInThisFile = 0;
                    // 创建
                    List<String> allLineList = new ArrayList<>();
                    // 尝试下面的代码
                    try (
                        // 创建
                        FileInputStream fileInputStream = new FileInputStream(file);
                        // 创建
                        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
                        // 创建
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
                    ) {
                        // 定义
                        String line = null;
                        // 读一行
                        while ((line = bufferedReader.readLine()) != null) {
                            // 判断
                            if (line.trim().equals("")) {
                                // 增加
                                blankLineCount += 1;
                            // 判断
                            } else if (line.trim().startsWith("/") || line.trim().startsWith("*")) {
                                // 增加
                                noteLineCount += 1;
                            // 否则
                            } else {
                                // 增加
                                javaLineCountInThisJavaFile += 1;
                                // 增加
                                validJavaLineCount += 1;
                                // 判断
                                if (line.contains("public ") && line.contains("(")) {
                                    // 增加
                                    functionLineCount += 1;
                                    // 增加
                                    functionLineCountInThisFile += 1;
                                // 判断
                                }else if(line.contains("private ") && line.contains("(")) {
                                    // 增加
                                    functionLineCount += 1;
                                    // 增加
                                    functionLineCountInThisFile += 1;
                                // 判断
                                }else if(line.contains("protected ") && line.contains("(")) {
                                    // 增加
                                    functionLineCount += 1;
                                    // 增加
                                    functionLineCountInThisFile += 1;
                                // 判断
                                }else if(line.contains("static ") && line.contains("(")) {
                                    // 增加
                                    functionLineCount += 1;
                                    // 增加
                                    functionLineCountInThisFile += 1;
                                // 判断
                                }else if(line.contains("void ") && line.contains("(")) {
                                    // 增加
                                    functionLineCount += 1;
                                    // 增加
                                    functionLineCountInThisFile += 1;
                                }
                            }
                        }
                        // 捕捉异常
                    } catch (Exception e) {
                    }
                    // 增加
                    JavaCheckFileCount += 1;
                    // 打印
                    System.out.println(file.getName() + "\t" + javaLineCountInThisJavaFile + "\t" + functionLineCountInThisFile);
                }
            }
        }
    }
}
